"""
应用配置管理模块

负责加载和管理环境变量配置，提供统一的配置访问接口。
支持从 .env 文件和环境变量中读取配置，并进行类型验证。

主要功能：
1. 环境变量加载和验证
2. 配置项类型转换
3. 默认值设置
4. 配置项分组管理

作者: LLM Chat System
版本: 1.0.0
"""

import os
from typing import List, Optional
from pydantic_settings import BaseSettings
from pydantic import Field


class Settings(BaseSettings):
    """
    应用配置类
    
    使用 Pydantic Settings 进行配置管理，支持：
    - 环境变量自动加载
    - 类型验证和转换
    - 默认值设置
    - 配置项文档化
    """
    
    # ==================== 应用基础配置 ====================
    app_name: str = Field(
        default="大模型集成对话系统", 
        env="APP_NAME",
        description="应用名称"
    )
    app_version: str = Field(
        default="1.0.0", 
        env="APP_VERSION",
        description="应用版本号"
    )
    debug: bool = Field(
        default=False, 
        env="DEBUG",
        description="是否开启调试模式"
    )
    secret_key: str = Field(
        default="your-secret-key-here", 
        env="SECRET_KEY",
        description="应用密钥，用于加密和签名"
    )
    
    # ==================== 数据库配置 ====================
    database_url: str = Field(
        default="mysql+pymysql://root:admin@localhost:3306/fengxuan_model",
        env="DATABASE_URL",
        description="数据库连接 URL"
    )
    redis_url: str = Field(
        default="redis://localhost:6379/0", 
        env="REDIS_URL",
        description="Redis 缓存连接 URL"
    )
    
    # ==================== 日志配置 ====================
    log_level: str = Field(
        default="INFO", 
        env="LOG_LEVEL",
        description="日志级别：DEBUG, INFO, WARNING, ERROR, CRITICAL"
    )
    log_file: str = Field(
        default="logs/app.log", 
        env="LOG_FILE",
        description="日志文件路径"
    )
    
    # ==================== 文件上传配置 ====================
    upload_dir: str = Field(
        default="uploads", 
        env="UPLOAD_DIR",
        description="文件上传目录"
    )
    max_file_size: int = Field(
        default=10485760, 
        env="MAX_FILE_SIZE",
        description="最大文件大小（字节），默认 10MB"
    )
    
    # ==================== 模型配置 ====================
    openai_api_key: str = Field(
        default="your-openai-api-key-here", 
        env="OPENAI_API_KEY",
        description="OpenAI API 密钥"
    )
    default_model_provider: str = Field(
        default="openai", 
        env="DEFAULT_MODEL_PROVIDER",
        description="默认模型提供商"
    )
    default_model_name: str = Field(
        default="gpt-3.5-turbo", 
        env="DEFAULT_MODEL_NAME",
        description="默认模型名称"
    )
    
    # ==================== 向量数据库配置 ====================
    chroma_persist_directory: str = Field(
        default="./chroma_db", 
        env="CHROMA_PERSIST_DIRECTORY",
        description="Chroma 向量数据库持久化目录"
    )
    
    # ==================== 会话配置 ====================
    max_conversation_length: int = Field(
        default=30, 
        env="MAX_CONVERSATION_LENGTH",
        description="最大对话轮数"
    )
    session_timeout: int = Field(
        default=3600, 
        env="SESSION_TIMEOUT",
        description="会话超时时间（秒），默认 1 小时"
    )
    
    # ==================== API 配置 ====================
    api_prefix: str = Field(
        default="/api/v1", 
        env="API_PREFIX",
        description="API 路径前缀"
    )
    cors_origins: List[str] = Field(
        default=["http://localhost:3000", "http://localhost:8080", "http://localhost:5173", "http://localhost:5174"], 
        env="CORS_ORIGINS",
        description="允许跨域访问的源地址列表"
    )
    
    # ==================== MCP 配置 ====================
    mcp_server_url: str = Field(
        default="ws://localhost:8080/mcp",
        env="MCP_SERVER_URL",
        description="MCP服务器WebSocket地址"
    )
    mcp_connection_timeout: int = Field(
        default=30,
        env="MCP_CONNECTION_TIMEOUT",
        description="MCP连接超时时间（秒）"
    )
    mcp_heartbeat_interval: int = Field(
        default=30,
        env="MCP_HEARTBEAT_INTERVAL",
        description="MCP心跳间隔（秒）"
    )
    mcp_max_retries: int = Field(
        default=3,
        env="MCP_MAX_RETRIES",
        description="MCP连接重试次数"
    )
    mcp_enable_ssl: bool = Field(
        default=False,
        env="MCP_ENABLE_SSL",
        description="是否启用MCP SSL连接"
    )
    mcp_request_timeout: int = Field(
        default=60,
        env="MCP_REQUEST_TIMEOUT",
        description="MCP请求超时时间（秒）"
    )
    
    class Config:
        """
        Pydantic 配置类
        
        配置 Pydantic 的行为：
        - env_file: 指定环境变量文件路径
        - env_file_encoding: 文件编码格式
        - case_sensitive: 是否区分大小写
        - extra: 允许额外字段
        """
        env_file = ".env"              # 环境变量文件路径
        env_file_encoding = "utf-8"    # 文件编码格式
        case_sensitive = False         # 不区分大小写
        extra = "ignore"               # 忽略额外字段


# 全局配置实例
# 在应用启动时创建，整个应用生命周期内共享
settings = Settings()


def get_settings() -> Settings:
    """
    获取配置实例
    
    提供统一的配置访问接口，确保整个应用使用相同的配置实例
    
    Returns:
        Settings: 全局配置实例
    """
    return settings
